package secondStage.part6.Lambda表达式.Lambda与匿名内部类;

/**
 * @ClassName: [LambdaDemo4]
 * @Description: Lambda表达式与匿名内部类的区别
 * @Author: [黄劲松]
 * @CreateDate: [2021-04-07]
 * @Version: [v1.0]
 */
/*
1.7 Lambda表达式和匿名内部类的区别
所类型不同
    ●匿名内部类: 可以是接口，可以是抽象类,还可以是具体类
    ●Lambda表达式: 只能是接口
使用限制不同
    ●如果接口中有且仅有一个抽象方法，可以使用L ambda表达式，也可以使用匿名内部类
    ●如果接口多于一个抽象方法，只能使用匿名内部类，而不能使用L ambda表达式
实现原理不同
    ●匿名内部类: 编译之后，产生-个单独的.class字节码文件
    ●Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
 */
public class LambdaDemo4 {
    public static void main(String[] args) {
        //匿名内部类
        useInter(new Inter() {
            @Override
            public void show() {
                System.out.println("使用接口");
            }
        });
        useAnimal(new Animal() {
            @Override
            public void method() {
                System.out.println("抽象类");
            }
        });
        useStudent(new Student(){
            @Override
            public void study() {
                System.out.println("具体类");
            }
        });
        //Lambda表达式
        System.out.println("-------Lambda表达式-----");
        useInter(()-> System.out.println("接口"));
//        useAnimal(()-> System.out.println("抽象类"));//报错
//        useStudent(()-> System.out.println("具体类"));//报错
/*        useInter((new Inter() {
            @Override
            public void show() {
                System.out.println("show1");
            }

            @Override
            public void show2() {
                System.out.println("show2");
            }
        }));*/

    }
    public static void useAnimal(Animal a){
        a.method();
    }
    private static void useInter(Inter inter) {
        inter.show();
    }
    private static void useStudent(Student s){
        s.study();
    }
}
